<?php
include_once 'GanJiFunc.php';

class GanJiRelationFunc
{

    static $tianGan=array(0=>'甲',1=>'乙',2=>'丙',3=>'丁',4=>'戊',5=>'己',6=>'庚',7=>'辛',8=>'壬',9=>'癸');
    static $tianGan2Id=array('甲'=>0,'乙'=>1,'丙'=>2,'丁'=>3,'戊'=>4,'己'=>5,'庚'=>6,'辛'=>7,'壬'=>8,'癸'=>9);
    static $diJi=array(0=>'子',1=>'丑',2=>'寅',3=>'卯',4=>'辰',5=>'巳',6=>'午',7=>'未',8=>'申',9=>'酉',10=>'戌',11=>'亥');
    static $diJi2Id=array('子'=>0,'丑'=>1,'寅'=>2,'卯'=>3,'辰'=>4,'巳'=>5,'午'=>6,'未'=>7,'申'=>8,'酉'=>9,'戌'=>10,'亥'=>11);
    static $Ji6Ho=array('子'=>'丑','丑'=>'子','寅'=>'亥','寅'=>'亥','卯'=>'戌','卯'=>'戌','辰'=>'酉','辰'=>'酉','巳'=>'申','巳'=>'申','午'=>'未','午'=>'未');
     
    static $mapJi六沖=array(
            '子'=>'午',
            '丑'=>'未',
            '寅'=>'申',
            '卯'=>'酉',
            '辰'=>'戌',
            '巳'=>'亥',
            '午'=>'子',
            '未'=>'丑',
            '申'=>'寅',
            '酉'=>'卯',
            '戌'=>'辰',
            '亥'=>'巳');

    static $mapJi六害=array(
            '子'=>'未',
            '丑'=>'午',
            '寅'=>'巳',
            '卯'=>'辰',
            '辰'=>'卯',
            '巳'=>'寅',
            '午'=>'丑',
            '未'=>'子',
            '申'=>'亥',
            '酉'=>'戌',
            '戌'=>'酉',
            '亥'=>'申');


    //三合的養位 為三殺
    static $map三殺=array(
            '子'=>'未',
            '辰'=>'未',
            '申'=>'未',
            '寅'=>'丑',
            '午'=>'丑',
            '戌'=>'丑',
            '巳'=>'辰',
            '酉'=>'辰',
            '丑'=>'辰',
            '卯'=>'戌',
            '未'=>'戌',
            '亥'=>'戌');

    //取 所合 的病位..
    static $map驛馬=array(
            '申'=>'寅',
            '子'=>'寅', //陽水 病於 銀
            '辰'=>'寅',

            '寅'=>'申',
            '午'=>'申', //陽丙 病於 申
            '戌'=>'申',

            '巳'=>'亥',
            '酉'=>'亥', //陽金病於 亥
            '丑'=>'亥',

            '亥'=>'巳',
            '卯'=>'巳', //陽木病於巳
            '未'=>'巳');

    static $map堆錄=array(
            '甲'=>'寅',
            '乙'=>'卯',
            '丙'=>'巳',
            '丁'=>'午',
            '戊'=>'巳',
            '己'=>'午',
            '庚'=>'申',
            '辛'=>'酉',
            '壬'=>'戌',
            '癸'=>'亥');

    static $map堆長生=array(
            '甲'=>'亥',
            '乙'=>'午',
            '丙'=>'寅',
            '丁'=>'酉',
            '戊'=>'寅',
            '己'=>'酉',
            '庚'=>'巳',
            '辛'=>'子',
            '壬'=>'申',
            '癸'=>'卯');

    static $map堆旺=array(
            '甲'=>'卯',
            '乙'=>'寅',
            '丙'=>'午',
            '丁'=>'巳',
            '戊'=>'午',
            '己'=>'巳',
            '庚'=>'酉',
            '辛'=>'申',
            '壬'=>'子',
            '癸'=>'亥');


    //天以貴人判定法
    //日干 vs 任何地支

    static protected function getGanJiIWithId($gangi)
    {
        $gj=GanJiFunc::splitGJ($gangi);
        $gj['干id']=self::$tianGan2Id[$gj['干']];
        $gj['支id']=self::$diJi2Id[$gj['支']];
        return $gj;
    }
    function check三合($srcgj,$refgj,&$result)
    {
        $id1=$srcgj['支id'];
        $id2=$refgj['支id'];
        if((($id1-$id2)%4)==0)
        {
            $result['三合']=$refgj['支'];
        }
    }
    function check六合($srcgj,$refgj,&$result)
    {
        $ji=self::$Ji6Ho[$srcgj['支']];
        if($ji==$refgj['支'])
            $result['六合']=$refgj['支'];
    }

    static  $map堆貴=array(
            '甲'=>array('丑','未'),
            '戊'=>array('丑','未'),
            '乙'=>array('子','申'),
            '己'=>array('子','申'),
            '丙'=>array('酉','亥'),
            '丁'=>array('酉','亥'),
            '庚'=>array('丑','未'), //這是萬明英 所記載
            //'庚'=>array('寅','午'), //這是 通行的
            '辛'=>array('寅','午'),
            '壬'=>array('卯','巳'),
            '癸'=>array('卯','巳'));

    static  $map進貴=array(
            '子'=>array('乙','己'),
            '丑'=>array('甲','戊'),
            '寅'=>array('辛'),
            '卯'=>array('壬','癸'),
            '辰'=>array('',''), //貴人不坐
            '巳'=>array('壬','癸'),
            '午'=>array('辛'),
            '未'=>array('甲','戊'),
            '申'=>array('乙','己'),
            '酉'=>array('丙','丁'),
            '戌'=>array('',''), //貴人不坐
            '亥'=>array('丙','丁'));
    //戊戌 乃是牢獄之地  貴人不靈~~
    //貴人不到 戊戌
    //貴人在旁邊~~貴人可以化解 假三殺
    function check堆貴 ($srcgj,$refgj,&$result)
    {
        $ji=$refgj['支'];
        $d=self::$map堆貴[$srcgj['干']];
        if(($d[0]==$ji)||($d[1]==$ji))
        {
            $result['堆貴']=$ji;
        }
    }
    //自己是別人的貴人
    //今天的日子 我的 是日子的貴人?
    //對於進貴堆貴還是不太了解
    //進貴 就反過來..自己的地支 是日干的貴人

    function check進貴 ($srcgj,$refgj,&$result)
    {
        //辰戌 貴人不作
        $ji=$srcgj['支'];
        $gan=$refgj['干'];
        $gans=self::$map進貴[$ji];
        $sz=count($gans);
        for($i=0;$i<$sz;$i++)
        {
            if($gans[$i]==$gan)
            {
                $result['進貴']=$gan;
            }
        }
    }

    function check六沖 ($srcgj,$refgj,&$result)
    {
        if(self::$mapJi六沖[$srcgj['支']]==$refgj['支'])
        {
            $result['六沖']=$refgj['支'];
        }
    }

    protected  static  function seekGanToJi($srcgj,$refgj,&$result,$map,$itemName)
    {
        $gan=$srcgj['干'];
        $ji=$refgj['支'];
        foreach($map as $g=>$j)
        {
            if(($g==$gan)&&($ji==$j))
            {
                $result[$itemName]=$ji;
                return;
            }
        }
    }
    protected static  function seekJiToGan($srcgj,$refgj,&$result,$map,$itemName)
    {
        $gan=$refgj['干'];
        $ji=$srcgj['支'];
        foreach($map as $g=>$j)
        {
            if(($g==$gan)&&($ji==$j))
            {
                $result[$itemName]=$gan;
                return;
            }
        }
    }
    //======================
    function check堆長生($srcgj,$refgj,&$result)
    {
        self::seekGanToJi($srcgj, $refgj, $result, self::$map堆長生,'堆長生');
    }
    //======================
    function check進長生($srcgj,$refgj,&$result)
    {
        self::seekJiToGan($srcgj, $refgj, $result,  self::$map堆長生, '進長生');
    }

    public static function check堆旺($srcgj,$refgj,&$result)
    {
        self::seekGanToJi($srcgj, $refgj, $result, self::$map堆旺,'堆旺');
    }
    public static function check進旺($srcgj,$refgj,&$result)
    {
        self::seekJiToGan($srcgj, $refgj, $result, self::$map堆旺,'進旺');
    }
     
    function check堆錄($srcgj,$refgj,&$result)
    {
        self::seekGanToJi($srcgj, $refgj, $result, self::$map堆錄,'堆錄');
    }

    function check進錄($srcgj,$refgj,&$result)
    {
        self::seekJiToGan($srcgj, $refgj, $result, self::$map堆錄,'進錄');
    }

    //-------------------------------------------------------------------
    protected static function checkJiJi($srcgj,$refgj,&$result,$map,$mapName)
    {
        $ji1=$srcgj['支'];
        $ji2=$refgj['支'];
        //-------------------------
        foreach($map as $key =>$value)
        {
            if(($ji1==$key)&&($ji2==$value))
            {
                $result[$mapName]=$ji2;
            }
        }
    }

    protected static function checkJiJiInv($srcgj,$refgj,&$result,$map,$mapName)
    {
        $ji1=$srcgj['支'];
        $ji2=$refgj['支'];
        //-------------------------
        foreach($map as $key =>$value)
        {
            if(($ji2==$key)&&($ji1==$value))
            {
                $result[$mapName]=$ji2;
                return;
            }
        }
    }

    static function check六害($srcgj,$refgj,&$result)
    {
    self::checkJiJi($srcgj, $refgj, $result, self::$mapJi六害, '六害');
    }
    static function check堆馬($srcgj,$refgj,&$result)
    {
        self::checkJiJi($srcgj, $refgj, $result, self::$map驛馬, '堆馬');
    }
    static function check進馬($srcgj,$refgj,&$result)
    {
        self::checkJiJiInv($srcgj, $refgj, $result, self::$map驛馬, '進馬');
    }
    static function check三殺($srcgj,$refgj,&$result)
    {
        self::checkJiJi($srcgj, $refgj, $result, self::$map三殺, '三殺');
    }

    static $map三刑=array(
            '子'=>array('卯'=>'子卯互刑(無禮之刑)'),
            '丑'=>array('戌'=>'丑刑戌(無恩之刑)','未'=>'丑被未刑(無恩之刑)'),
            '寅'=>array('巳'=>'寅刑巳(恃勢之刑)','申'=>'寅被申刑(恃勢之刑)' ),
            '卯'=>array('子'=>'子卯互刑(無禮之刑)'),
            '辰'=>array('辰'=>'辰辰自刑'),
            '巳'=>array('寅'=>'巳被寅刑(恃勢之刑)','申'=>'巳刑申(恃勢之刑)'),
            '午'=>array('午'=>'午午自刑'),
            '未'=>array('戌'=>'未被戌刑(無恩之刑)','丑'=>'未刑丑(無恩之刑)'),
            '申'=>array('寅'=>'申刑寅(恃勢之刑)','巳'=>'申被巳刑(恃勢之刑)'),
            '酉'=>array('酉'=>'酉酉自刑'),
            '戌'=>array('未'=>'戌刑未(無恩之刑)','丑'=>'戌被丑刑(無恩之刑)'),
            '亥'=>array('亥'=>'亥亥自刑'));

    static function check三刑($srcgj,$refgj,&$result)
    {
        $ji1=$srcgj['支'];
        $ji2=$refgj['支'];
        foreach(self::$map三刑 as $key=>$submap)
        {
            if($key==$ji1)
            {
                foreach($submap as $k=>$v)
                {
                    if($k==$ji2)
                    {
                        $result['三刑']=$v;
                        return;
                    }
                }
            }

        }
    }
    function getRelation($mainGanJi,$Ganji)
    {
         
        $srcgj= self::getGanJiIWithId($mainGanJi);
        $refgj= self::getGanJiIWithId($Ganji);
        
        
        $result =array();
        //干比較簡單
        self::check三合($srcgj,$refgj,$result);
        self::check六合($srcgj,$refgj,$result);
        self::check堆貴($srcgj,$refgj,$result);
        self::check進貴($srcgj,$refgj,$result);
        self::check堆錄($srcgj,$refgj,$result);
        self::check進錄($srcgj,$refgj,$result);
        self::check堆旺($srcgj,$refgj,$result);
        self::check進旺($srcgj,$refgj,$result);
        self::check堆長生($srcgj,$refgj,$result);
        self::check進長生($srcgj,$refgj,$result);
        self::check堆馬($srcgj,$refgj,$result);
        self::check進馬($srcgj,$refgj,$result);
        self::check六沖($srcgj,$refgj,$result);
        self::check三殺($srcgj,$refgj,$result);
        self::check三刑($srcgj,$refgj,$result);
        self::check六害($srcgj,$refgj,$result);
        
        return $result;
        //----3合
    }


}


